﻿<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>StringGetPos</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link href="../css/commands.css" rel="stylesheet" type="text/css">
<link href="../css/print.css" rel="stylesheet" type="text/css" media="print">
</head>
<body>

<h1>StringGetPos</h1>

<p>返回指定的子字符串在一个字符串中的位置。</p>

<p class="CommandSyntax">StringGetPos, OutputVar, InputVar, SearchText [, L#|R#, Offset]<br>
    Position := <a href="../Functions.htm#InStr">InStr</a>(Haystack, Needle [, CaseSensitive?, StartingPos]) <em>; 具体请查看 <a href="../Functions.htm#InStr">InStr() 函数</a> 。</em></p>
<h3>参数 </h3>
<table border="1" width="100%" cellspacing="0" cellpadding="3" bordercolor="#C0C0C0">
  <tr>
    <td width="15%">OutputVar</td>
    <td width="85%">存储子字符串在 <em>InputVar</em> 中的位置的变量名。在 StringGetPos 命令中，第一个字符的位置是 0 ，而在 <a href="../Functions.htm#InStr">InStr()</a> 函数中第一个字符的位置是 1 。</td>
  </tr>
  <tr>
    <td>InputVar</td>
    <td>需要被查找的字符串变量名。不要在变量名外加百分号，除非你想使用变量中的 <em>内容</em> 作为变量名。</td>
  </tr>
  <tr>
    <td>SearchText</td>
    <td>查找的文本。不区分大小写，除非打开了 <a href="StringCaseSense.htm">StringCaseSense</a> 。</td>
  </tr>
  <tr>
    <td>L#|R#</td>
    <td><p>当 <em>SearchText</em> 在 <em>InputVar</em> 中出现不止一次的时候，这个参数决定查找的方向。如果省略该参数，将从 <em>InputVar</em> 的左边开始查找，直到找到首个匹配的结果。如果该参数使用 1 或者 R ，将从 <em>InputVar</em> 的右边开始查找，直到找到首个匹配的结果。</p>
      <p>要查找非首个匹配，在字母 L 或 R 后跟上相应的数字。例如，要从右边开始查找第四个匹配的结果，指定参数 r4 。注意：如果指定的数字小于或等于 0 ，不会找到匹配的结果。</p>    </td>
  </tr>
  <tr>
    <td>Offset</td>
    <td>偏移。从左边或右边（取决于上面的参数）开始跳过多少个字符再开始查找。如果省略，默认是 0 。例如，下面的例子会从左边第十个字符开始查找：StringGetPos, OutputVar, InputVar, abc, , 9 。这个参数可以是一个 <a href="../Variables.htm#Expressions">expression/表达式</a> 。</td>
  </tr>
</table>

<h3>ErrorLevel</h3>
<p>当 <em>InputVar</em> 中未包含 <em>SearchText</em> 的时候 <a href="../misc/ErrorLevel.htm">ErrorLevel/错误级别</a> 被设置为 1 ，包含的时候设置为 0 。</p>
<h3>注意</h3>
<p>与 <a href="StringMid.htm">StringMid</a> 以及 <a href="../Functions.htm#InStr">InStr()</a> 不同的是，在 StringGetPos 中第一个字符的位置是 0 。</p>
<p>返回的位置总是相对于 <em>InputVar</em> 的第一个字符的，而与是否使用 <em>L#|R#</em> 以及 <em>Offset</em> 参数无关。例如，字符串 “abc”在 123abc789 中的位置永远是 3 ，不管使用了什么参数。</p>
<p>如果在指定的条件下，在 <em>InputVar</em> 中未能找到 <em>SearchText</em> ，<em>OutputVar</em> 会被设置为 -1 ，<a href="../misc/ErrorLevel.htm">ErrorLevel</a> 会被设置为 1 。</p>
<p>使用 <a href="SplitPath.htm">SplitPath</a> 可以更容易将一个文件路径分解为目录，文件名，扩展名。</p>
<p>内置变量 <a href="../Variables.htm">%A_Space%</a> 和 <a href="../Variables.htm">%A_Tab%</a> 包含了一个单独的空格和一个单独的制表符。当你需要单独搜索空格或制表符，或者在 <em>SearchText</em> 的开头或结尾使用空格或制表符的时候会非常有用。</p>
<h3>相关命令</h3>
<p><a href="../Functions.htm#InStr">InStr()</a>, <a href="RegExMatch.htm">RegExMatch()</a>, <a href="IfInString.htm">IfInString</a>, <a href="IfIn.htm">if var in/contains MatchList</a>, <a href="StringCaseSense.htm">StringCaseSense</a>, <a href="StringReplace.htm">StringReplace</a>, <a href="SplitPath.htm">SplitPath</a>, <a href="StringLeft.htm">StringLeft</a>, <a href="StringLeft.htm">StringRight</a>, <a href="StringMid.htm">StringMid</a>, <a href="StringTrimLeft.htm">StringTrimLeft</a>, <a href="StringTrimLeft.htm">StringTrimRight</a>, <a href="StringLen.htm">StringLen</a>, <a href="StringLower.htm">StringLower</a>, <a href="StringLower.htm">StringUpper</a>, <a href="IfIs.htm">if var is type</a> </p>
<p><br>
<strong>示例</strong></p>
<pre class="NoIndent">Haystack = abcdefghijklmnopqrs
Needle = def
StringGetPos, pos, Haystack, %Needle%
if pos &gt;= 0
    MsgBox, The string was found at position %pos%.</pre>
<p>&nbsp;</p>
<pre class="NoIndent"><em>; 示例 #2：</em>
<em>; 将一个完整的文件路径分解为各个组成部分。</em>
<em>; 注意，使用 <a href="StringSplit.htm">StringSplit</a> 或者</em>
<em>; <a href="LoopParse.htm">parsing loop</a> 会更加方便，这里只是举个例子。</em>
FileSelectFile, file, , , Pick a filename in a deeply nested folder:
if file &lt;&gt;
{
    StringLen, pos_prev, file
    pos_prev += 1 <em>; 调整位置到最后一个字符之后。</em>
    Loop
    {
        <em>; 从右边开始查找第N个匹配</em>
        <strong>StringGetPos</strong>, pos, file, \, R%A_Index%
        if ErrorLevel
            break
        length := pos_prev - pos - 1
        pos_prev := pos
        pos += 2  <em>; 为了使用StringMid进行调整。</em>
        StringMid, path_component, file, %pos%, %length%
        MsgBox Path component #%a_index% (from the right) is:`n%path_component%
    }
}</pre>

</body>
</html>
